<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>继承</title>
    <script>
        /* 
            继承(extends)
                经过继承，可以在不修改一个类的情况下对其进行扩展。
                OCP开闭原则
                    程序应该对修改关闭，对扩展开放。

            我们可以通过extends关键字来完成继承操作

            当一个类继承另一个类时，就相当于将一个类中的代码复制到当前类中（简单理解）
                继承发生时，被继承的类称为父类（超类），继承的称为子类
                通过继承可以减少重复的代码，并且可以在不修改一个类的前提下对齐进行拓展。

            在子类中可以通过创建同名方法来重写父类的方法。
            如果子类的属性和父类的属性不同，想要修改属性，这时就要在子类中重写构造函数，重写构造函数时，构造函数的第一行代码必须为super()
            super()里面传的是构造函数的参数，而不是属性名。

            在子类的方法中可以通过super.父类的方法，从而达到在子类中调用父类的方法

        */


        class Family {
            constructor(a, b, c, d) {
                this.name = a
                this.age = b
                this.gender = c
                this.address = d
            }

            sayHello() {
                console.log(`${this.name}正在做什么？`)
            }


        }


        class Person extends Family {
            //重写构造函数
            
            constructor(a, b, c, d,e){
            //  重写构造函数时，构造函数的第一行代码必须为super()
            super(a,b,c,d)     // 意思是创建父类的实例（一定要注意，这里的super（）调用时传递的参数是构造函数里的参数，而不是属性名）
            this.school=e

            }
            sayHello() {
                super.sayHello()    // 在方法中可以使用super来引用父类的方法
                console.log(`${this.name}正在学JS`)
            }

        }


        class Cat extends Family {
            sayHello() {
                console.log(`${this.name}正在学睡大觉`)
            }
        }

        const family1= new Family("李",30,'男','甘肃天水')
        const people_1 = new Person('小李', 27, '男', '甘肃天水','南京工业大学')
        const cat_1 = new Cat('朱丽叶', 2, '女', '江苏南京')

        people_1.sayHello()
        cat_1.sayHello()

        console.log(family1)
        console.log(people_1)
        console.log(cat_1)



        /*
        两个类都有name,age,gender,以及address,但是它们的sayHello不一样。

        如何创建其它的类，使让它们满足以下要求？
            1.都具有name,age,gender,address
            2.但是拥有不同的sayhello？
            3.people_1中的属性发生变化

            可以通过创建一个总类，让其它类来继承这个总类（解决了1）
            然后在子类中创建同名方法来重写sayHello（解决了2）

         */





    </script>

</head>

<body>

</body>

</html>